/**
 * 阿里云oss上传工具
 *
 */
import Vue from 'vue';
import OSS from 'ali-oss';
import config from '@/config';

import moment from 'moment';

// 临时授权过期时间
let expiration = null;

/**
 *
 * @param secure  {Boolean}：(secure: true) 则使用 HTTPS， (secure: false) 则使用 HTTP，详情请查看常见问题。
 * @param accessKeyId {String}：通过阿里云控制台创建的access key。
 * @param accessKeySecret {String}：通过阿里云控制台创建的access secret。
 * @param stsToken {String}：使用临时授权方式，详情请参见使用STS访问。
 * @param bucket {String}：通过控制台创建的bucket。
 * @param endpoint {String}：OSS域名。
 * @param region {String}：bucket 所在的区域，默认 oss-cn-hangzhou。
 * @param internal {Boolean}：是否使用阿里云内网访问，默认false。比如通过ECS访问OSS，则设置为true，采用internal的endpoint可节约费用。
 * @param cname {Boolean}：是否支持上传自定义域名，默认false。如果cname为true，endpoint传入自定义域名时，自定义域名需要先同bucket进行绑定。
 * @param isRequestPay {Boolean}：bucket是否开启请求者付费模式，默认false。具体可查看请求者付费模式。
 * @param timeout   {String|Number}：超时时间，默认 60s。
 * @returns {Promise<*>}
 */
export default async ({
	secure = true,
	region = 'oss-cn-shenzhen',
	accessKeyId,
	accessKeySecret,
	bucket,
	endpoint = config.baseUrl.image_host,
	stsToken,
	internal = false,
	cname = false,
	isRequestPay = false,
	timeout = '120s',
} = {}) => {
	// 获取store中临时存储的配置信息与临时授权
	// 一般后台返回的临时授权为10分钟，10分钟过后，需要重新获取
	let data = Vue.$store.getters['AliOss/config'] || {};
	const isExpiration = () => {
		if (data && data.expiration) {
			return moment().isAfter(data.expiration);
		}
		return !stsToken;
	};
	// 判断是否授权过期，过期重新调取接口获取
	if (isExpiration()) {
		const result = await Vue.$ajax.Common.getAliOssConfig();
		if (result && result.code === 0) {
			data = result.data || {};
		} else {
			Vue.$ele.$message.error(result.message);
			return Promise.reject();
		}
	}
	let { access_key_id, access_key_secret, oss_bucket_name, security_token } = data || {};
	localStorage.debug = 'ali-oss';
	const client = new OSS({
		region,
		accessKeyId: accessKeyId || access_key_id,
		accessKeySecret: accessKeySecret || access_key_secret,
		bucket: bucket || oss_bucket_name,
		stsToken: stsToken || security_token,
		endpoint,
		secure,
		timeout,
		cname: typeof endpoint === 'string' && endpoint.length > 0 ? true : cname,
		isRequestPay,
		internal,
	});
	client.isExpiration = isExpiration;
	return client;
};
